const express = require('express')
const cookieParser = require('cookie-parser'); // 引入中间件
const authMiddleware = require('./login/authnext')
const WebSocket = require('ws');
const bodyParser = require('body-parser');
const app = express()

// 白名单（不需要验证的路由）
const whitelist = ['/login'];

// 全局验证中间件（跳过白名单）
app.use((req, res, next) => {
  if (whitelist.includes(req.path)) {
    return next(); // 跳过验证
  }
  authMiddleware(req, res, next); // 验证其他路由
});

// 启用 cookie 解析（必须在路由之前！）
app.use(cookieParser());
//解析urlencoded的请求体数据
app.use(express.urlencoded({ extended: true }))
//资源共享---只有打包的时候再去共享资源 研发共享
const cors = require('cors')
app.use(cors({
  origin: 'http://localhost:5173', // 你的前端地址
  credentials: true // 允许携带 Cookie
}));

// 使用中间件
app.use(bodyParser.json());
//静态文件托管 ----  访问：http:localhost:80/图片.jpg
app.use(express.static('upload'))


const server = app.listen(8088, () => {
  console.log('http://127.0.0.1')
})

// 模拟数据库
let notifications = [];
// 创建WebSocket服务器
const wss = new WebSocket.Server({ server });

// 存储所有连接的客户端
const clients = new Map();

//路由--产品
const router = require('./router')(clients)
//订单
const order = require('./order')
//广告
const advert = require('./advert')


app.use('/', router)
app.use('/order', order)
app.use('/advert', advert)

// WebSocket连接处理
wss.on('connection', (ws, req) => {
  console.log('New client connected');

  // 初始时不关联用户
  clients.set(ws, { isAdmin: false, userId: null });

  // 发送历史通知
  if (notifications.length > 0) {
    ws.send(JSON.stringify({
      type: 'initial_notifications',
      data: notifications
    }));
  }

  // 连接关闭时移除客户端
  ws.on('close', () => {
    console.log('Client disconnected');
    clients.delete(ws);
  });

  // 处理来自客户端的消息
  ws.on('message', (message) => {
    try {
      const { type, data } = JSON.parse(message);
      console.log(type, data);
      if (type === 'send_notification') {
        handleAdminNotification(data, ws);
      }
    } catch (err) {
      console.error('Error parsing message:', err);
    }
  });
});

// 管理员发送通知处理
function handleAdminNotification(data, ws) {
  const { title, message } = data;

  if (!title || !message) {
    ws.send(JSON.stringify({
      type: 'error',
      message: '标题和内容不能为空'
    }));
    return;
  }

  // 创建新通知
  const newNotification = {
    id: Date.now(),
    title,
    message,
    timestamp: new Date().toISOString(),
    senderId: clients.get(ws).userId
  };

  // 存储通知
  notifications.push(newNotification);

  // 限制通知数量
  if (notifications.length > 100) {
    notifications = notifications.slice(-100);
  }

  // 广播通知给所有客户端
  broadcast({
    type: 'new_notification',
    data: newNotification
  });

  ws.send(JSON.stringify({
    type: 'notification_sent',
    data: newNotification
  }));
}

// 获取历史通知
app.get('/notifications', (req, res) => {
  res.json(notifications);
});

// 广播消息给所有客户端
function broadcast(message) {
  const messageString = JSON.stringify(message);
  clients.forEach(client => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(messageString);
    }
  });
}